<?PHP
/**
 * $Rev: 12 $
 * $Id: singleton.php 12 2013-03-06 12:38:44Z vad.oparin@gmail.com $
 */
abstract class singleton {
	/**
	 * Массив объектов-наследников класса
	 * @access protected
	 */
    protected static $instances;

	/**
	 * Заглушка для предотвращения создания экземпляров через восстановление
	 * @return void
	 * @access protected
	 */
    private function __wakeup() {
        /*no-op*/
    }

	/**
	 * Заглушка для предотвращения создания экземпляров через клонирование
	 * @return void
	 * @access protected
	 */
    private function __clone() {
        /*no-op*/
    }

    /**
     * Заглушка конструктора для предотвращения создания экземпляров класса
     * @return void
     * @access protected
     */
    protected function __construct() {
        /*no-op*/
    }

    /**
     * Возвращает экземпляр класса-наследника
     * @return object
     * @access public
     */
    public static function getInstance() {
        $className = get_called_class();
        if (!self::$instances[$className]) {
            self::$instances[$className] = new $className;
        }
        return self::$instances[$className];
    }

}
